import axios from 'axios'
import { showToast, showLoadingToast, closeToast } from 'vant'
import { useUserStore } from '@/store/user'

/**
 * HTTP请求封装
 * 基于axios封装，包含请求拦截器、响应拦截器和错误处理
 */

// 创建axios实例
const http = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})

// 请求计数器，用于控制loading显示
let requestCount = 0

/**
 * 显示loading
 */
const showLoading = () => {
  if (requestCount === 0) {
    showLoadingToast({
      message: '加载中...',
      forbidClick: true,
      duration: 0
    })
  }
  requestCount++
}

/**
 * 隐藏loading
 */
const hideLoading = () => {
  requestCount--
  if (requestCount <= 0) {
    requestCount = 0
    closeToast()
  }
}

/**
 * 请求拦截器
 */
http.interceptors.request.use(
  (config) => {
    // 显示loading（可通过配置关闭）
    if (config.showLoading !== false) {
      showLoading()
    }

    // 添加token到请求头（暂时注释掉）
    // const userStore = useUserStore()
    // const token = userStore.token
    // if (token) {
    //   config.headers.Authorization = `Bearer ${token}`
    // }

    // 添加时间戳防止缓存
    if (config.method === 'get') {
      config.params = {
        ...config.params,
        _t: Date.now()
      }
    }

    console.log('请求发送:', config)
    return config
  },
  (error) => {
    hideLoading()
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

/**
 * 响应拦截器
 */
http.interceptors.response.use(
  (response) => {
    hideLoading()
    
    const { data } = response
    console.log('响应接收:', data)

    // 根据业务状态码处理响应
    if (data.code === 200 || data.success === true) {
      return data
    } else if (data.code === 401) {
      // token过期或无效
      showToast('登录已过期，请重新登录')
      // const userStore = useUserStore()
      // userStore.logout()
      // 跳转到登录页面
      // router.push('/login')
      return Promise.reject(new Error(data.message || '登录已过期'))
    } else {
      // 其他业务错误
      showToast(data.message || '请求失败')
      return Promise.reject(new Error(data.message || '请求失败'))
    }
  },
  (error) => {
    hideLoading()
    console.error('响应错误:', error)

    let message = '网络错误'
    
    if (error.response) {
      const { status, data } = error.response
      switch (status) {
        case 400:
          message = data.message || '请求参数错误'
          break
        case 401:
          message = '登录已过期，请重新登录'
          // const userStore = useUserStore()
          // userStore.logout()
          break
        case 403:
          message = '没有权限访问'
          break
        case 404:
          message = '请求的资源不存在'
          break
        case 500:
          message = '服务器内部错误'
          break
        default:
          message = data.message || `请求失败 (${status})`
      }
    } else if (error.code === 'ECONNABORTED') {
      message = '请求超时'
    } else if (error.message === 'Network Error') {
      message = '网络连接失败'
    }

    showToast(message)
    return Promise.reject(error)
  }
)

/**
 * GET请求
 * @param {string} url - 请求地址
 * @param {object} params - 请求参数
 * @param {object} config - 请求配置
 * @returns {Promise} 请求Promise
 */
export const get = (url, params = {}, config = {}) => {
  return http.get(url, { params, ...config })
}

/**
 * POST请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求数据
 * @param {object} config - 请求配置
 * @returns {Promise} 请求Promise
 */
export const post = (url, data = {}, config = {}) => {
  return http.post(url, data, config)
}

/**
 * PUT请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求数据
 * @param {object} config - 请求配置
 * @returns {Promise} 请求Promise
 */
export const put = (url, data = {}, config = {}) => {
  return http.put(url, data, config)
}

/**
 * DELETE请求
 * @param {string} url - 请求地址
 * @param {object} config - 请求配置
 * @returns {Promise} 请求Promise
 */
export const del = (url, config = {}) => {
  return http.delete(url, config)
}

/**
 * 文件上传
 * @param {string} url - 上传地址
 * @param {FormData} formData - 文件数据
 * @param {object} config - 请求配置
 * @returns {Promise} 请求Promise
 */
export const upload = (url, formData, config = {}) => {
  return http.post(url, formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    ...config
  })
}

export default http